package com.pai4j.message.core.builder;

import com.pai4j.common.enums.InteractionMessageTypeEnum;
import com.pai4j.common.enums.community.ResourceTypeEnum;
import com.pai4j.domain.vo.dto.BaseMessageDTO;
import com.pai4j.message.model.SendResult;

/**
 * 消息构建器接口
 * 提供流式API构建和发送消息
 * 
 * 实现此接口可扩展新的消息类型
 *
 * @author PAI4J Team
 * @date 2025-11-01
 * @param <T> 消息DTO类型
 */
public interface MessageBuilder<T extends BaseMessageDTO> {

    /**
     * 设置消息发送者
     * 
     * @param senderId 发送者用户ID
     * @return this
     */
    MessageBuilder<T> sender(String senderId);

    /**
     * 设置消息接收者
     * 
     * @param receiverId 接收者用户ID
     * @return this
     */
    MessageBuilder<T> receiver(String receiverId);

    /**
     * 设置消息类型（互动消息）
     * 
     * @param type 消息类型枚举
     * @return this
     */
    MessageBuilder<T> messageType(InteractionMessageTypeEnum type);

    /**
     * 设置资源信息
     * 
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return this
     */
    MessageBuilder<T> resource(ResourceTypeEnum resourceType, String resourceId);

    /**
     * 设置资源信息（字符串类型）
     * 
     * @param resourceType 资源类型
     * @param resourceId 资源ID
     * @return this
     */
    MessageBuilder<T> resource(String resourceType, String resourceId);

    /**
     * 设置消息内容
     * 
     * @param content 消息内容
     * @return this
     */
    MessageBuilder<T> content(String content);

    /**
     * 使用模板设置消息内容
     * 
     * @param templateCode 模板代码
     * @param vars 模板变量
     * @return this
     */
    MessageBuilder<T> template(String templateCode, Object... vars);

    /**
     * 设置评论ID
     * 
     * @param commentId 评论ID
     * @return this
     */
    MessageBuilder<T> commentId(Long commentId);

    /**
     * 设置回复ID
     * 
     * @param replyId 回复ID
     * @return this
     */
    MessageBuilder<T> replyId(Long replyId);

    /**
     * 添加元数据
     * 
     * @param key 键
     * @param value 值
     * @return this
     */
    MessageBuilder<T> metadata(String key, Object value);

    /**
     * 设置发送渠道
     * 
     * @param channels 渠道列表
     * @return this
     */
    MessageBuilder<T> channels(String... channels);

    /**
     * 设置为异步发送
     * 
     * @return this
     */
    MessageBuilder<T> async();

    /**
     * 设置为同步发送（默认）
     * 
     * @return this
     */
    MessageBuilder<T> sync();

    /**
     * 设置优先级
     * 
     * @param priority 优先级（1-10）
     * @return this
     */
    MessageBuilder<T> priority(int priority);

    /**
     * 跳过拦截器
     * 
     * @return this
     */
    MessageBuilder<T> skipInterceptors();

    /**
     * 构建消息（不发送）
     * 
     * @return 消息DTO
     */
    T build();

    /**
     * 构建并发送消息
     * 
     * @return 发送结果
     */
    SendResult send();

    /**
     * 异步发送消息
     * 
     * @return 发送结果Future
     */
    java.util.concurrent.CompletableFuture<SendResult> sendAsync();

    /**
     * 验证消息是否有效
     * 
     * @return 是否有效
     */
    boolean validate();

    /**
     * 重置构建器（清空所有设置）
     * 
     * @return this
     */
    MessageBuilder<T> reset();
    
    MessageBuilder<T> activity(String activityName, String activityUrl);
}

